package com.dh.leetcode.one;

import org.junit.Assert;
import org.junit.Test;

import java.util.Arrays;

/**
 * @ClassName: _179_largest_number
 * @Description: 179. 最大数
 * <p>
 * 给定一组非负整数 nums，重新排列每个数的顺序（每个数不可拆分）使之组成一个最大的整数。
 * <p>
 * 注意：输出结果可能非常大，所以你需要返回一个字符串而不是整数。
 * <p>
 *  
 * <p>
 * 示例 1：
 * <p>
 * 输入：nums = [10,2]
 * 输出："210"
 * 示例 2：
 * <p>
 * 输入：nums = [3,30,34,5,9]
 * 输出："9534330"
 * 示例 3：
 * <p>
 * 输入：nums = [1]
 * 输出："1"
 * 示例 4：
 * <p>
 * 输入：nums = [10]
 * 输出："10"
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/largest-number
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * @Author: shouzimu
 * @Date: 2021/4/12 10:01
 */
public class _179_largest_number {
    /**
     * 排序规则
     * v1+v2和v2+v1比较这两个串哪个大
     *
     * @param nums
     * @return
     */
    public String largestNumber(int[] nums) {
        Integer[] copyNums = new Integer[nums.length];
        for (int i = 0; i < nums.length; i++) {
            copyNums[i] = nums[i];
        }
        Arrays.sort(copyNums, (v1, v2) -> {
            if (v1.equals(v2)) {
                return 0;
            }
            char[] a1 = String.valueOf(v1).concat(String.valueOf(v2)).toCharArray();
            char[] a2 = String.valueOf(v2).concat(String.valueOf(v1)).toCharArray();
            for (int i = 0; i < a1.length; i++) {
                if (a1[i] < a2[i]) {
                    return 1;
                } else if (a1[i] > a2[i]) {
                    return -1;
                }
            }
            return 0;
        });
        StringBuilder builder = new StringBuilder();
        int i = 0;
        for (; i < copyNums.length; i++) {
            if (copyNums[i] != 0) {
                break;
            }
        }
        if (i == nums.length) {
            return "0";
        }
        for (; i < copyNums.length; i++) {
            builder.append(copyNums[i]);
        }
        return builder.toString();
    }

    @Test
    public void largestNumberTest() {
        Assert.assertEquals("0", largestNumber(new int[]{0, 0, 0}));
        Assert.assertEquals("1113111311", largestNumber(new int[]{111311, 1113}));
        Assert.assertEquals("9534330", largestNumber(new int[]{3, 30, 34, 5, 9}));
        Assert.assertEquals("210", largestNumber(new int[]{10, 2}));
        Assert.assertEquals("10", largestNumber(new int[]{10}));
        Assert.assertEquals("1", largestNumber(new int[]{1}));
        Assert.assertEquals("1111", largestNumber(new int[]{1, 1, 1, 1}));
        Assert.assertEquals("83088308830", largestNumber(new int[]{8308, 8308, 830}));
    }
}
